#!/usr/bin/env python3
"""
使用PyInstaller将execute.py打包为macOS独立可执行程序
"""
import os
import subprocess
import shutil
from pathlib import Path

def build_macos_executable():
    """构建macOS独立可执行程序"""
    
    # 清理旧的构建文件
    build_dirs = ['build', 'dist', '__pycache__']
    for dir_name in build_dirs:
        if os.path.exists(dir_name):
            shutil.rmtree(dir_name)
            print(f"已清理: {dir_name}")
    
    # 可执行文件名
    exe_name = "雪票数据处理工具"
    
    # PyInstaller命令参数
    cmd = [
        'pyinstaller',
        '--name', exe_name,
        '--onefile',  # 打包为单个文件
        '--noconsole',  # 无控制台窗口（macOS应用模式）
        '--clean',  # 清理临时文件
        '--noconfirm',  # 自动确认覆盖
        '--osx-bundle-identifier', 'com.snowticket.processor',
        '--add-data', 'data.csv:.',  # 包含data.csv
        'execute.py'
    ]
    
    print("=" * 50)
    print("开始构建macOS独立可执行程序")
    print("=" * 50)
    
    try:
        # 执行打包命令
        result = subprocess.run(cmd, capture_output=True, text=True)
        
        if result.returncode == 0:
            print("✅ 打包成功!")
            
            # 获取可执行文件路径
            exe_path = f"dist/{exe_name}"
            if os.path.exists(exe_path):
                # 创建桌面快捷方式
                desktop_exe = f"/Users/jiale/Desktop/{exe_name}"
                shutil.copy2(exe_path, desktop_exe)
                os.chmod(desktop_exe, 0o755)
                
                print(f"📍 可执行文件位置: {exe_path}")
                print(f"📍 桌面快捷方式: {desktop_exe}")
                print(f"📊 文件大小: {os.path.getsize(desktop_exe) / 1024 / 1024:.1f} MB")
                
                return True
            else:
                print("❌ 可执行文件未找到")
                return False
        else:
            print("❌ 打包失败")
            print("错误信息:")
            print(result.stderr)
            return False
            
    except Exception as e:
        print(f"❌ 打包错误: {e}")
        return False

def create_standalone_package():
    """创建包含依赖的独立包"""
    
    print("\n" + "=" * 50)
    print("创建独立可执行包")
    print("=" * 50)
    
    # 清理旧的构建文件
    build_dirs = ['build', 'dist', '__pycache__']
    for dir_name in build_dirs:
        if os.path.exists(dir_name):
            shutil.rmtree(dir_name)
    
    # 可执行文件名
    exe_name = "雪票数据处理工具"
    
    # 构建命令
    cmd = [
        'pyinstaller',
        '--name', exe_name,
        '--onefile',
        '--noconsole',
        '--clean',
        '--noconfirm',
        '--osx-bundle-identifier', 'com.snowticket.processor',
        '--hidden-import', 'sqlite3',  # 确保sqlite3被包含
        '--hidden-import', 'csv',     # 确保csv模块被包含
        '--hidden-import', 're',      # 确保re模块被包含
        '--hidden-import', 'openpyxl',
        '--hidden-import', 'pandas',
        '--add-data', 'data.csv:.',
        'execute.py'
    ]
    
    try:
        result = subprocess.run(cmd, capture_output=True, text=True)
        
        if result.returncode == 0:
            print("✅ 独立包创建成功!")
            
            # 复制到桌面
            src_exe = f"dist/{exe_name}"
            dst_exe = f"/Users/jiale/Desktop/{exe_name}"
            
            if os.path.exists(src_exe):
                shutil.copy2(src_exe, dst_exe)
                os.chmod(dst_exe, 0o755)
                
                print(f"📍 独立可执行文件: {dst_exe}")
                print(f"📊 文件大小: {os.path.getsize(dst_exe) / 1024 / 1024:.1f} MB")
                
                return True
        else:
            print("❌ 独立包创建失败")
            print(result.stderr)
            return False
            
    except Exception as e:
        print(f"❌ 错误: {e}")
        return False

def check_dependencies():
    """检查依赖"""
    print("\n" + "=" * 30)
    print("检查依赖包")
    print("=" * 30)
    
    dependencies = [
        'sqlite3',
        'csv',
        're',
        'os',
        'sys',
        'glob',
        'datetime',
        'openpyxl',
        'pandas'
    ]
    
    missing = []
    for dep in dependencies:
        try:
            __import__(dep)
            print(f"✅ {dep}")
        except ImportError:
            print(f"❌ {dep} - 缺失")
            missing.append(dep)
    
    if missing:
        print(f"缺失依赖: {', '.join(missing)}")
        return False
    
    return True

def main():
    """主函数"""
    print("🚀 PyInstaller打包工具")
    print("目标: execute.py → macOS独立可执行程序")
    
    # 检查文件
    if not os.path.exists('execute.py'):
        print("❌ execute.py文件不存在")
        return
    
    # 检查依赖
    if not check_dependencies():
        print("❌ 依赖检查失败")
        return
    
    # 执行打包
    success = build_macos_executable()
    
    if success:
        print("\n🎉 打包完成!")
        print("使用方法:")
        print("1. 双击桌面上的 '雪票数据处理工具'")
        print("2. 程序将自动运行并处理数据")
        print("3. 结果文件将输出到桌面")
    else:
        print("\n❌ 打包失败，请检查错误信息")

if __name__ == "__main__":
    main()